package com.algorithm.liyc.practice;

import com.algorithm.liyc.entity.ListNode;

/**
 * 移除链表元素
 * 删除链表中等于给定值 val 的所有节点。
 * @author Liyc
 * @date 2023/11/23 10:31
 **/

public class Solution6 {
    /**
     * 直接使用原来的链表来进行移除节点操作
     * ● 时间复杂度: O(n)
     * ● 空间复杂度: O(1)
     */
    public ListNode removeElements1(ListNode head, int val) {
        while (head != null && head.val == val) {
            head = head.next;
        }
        // 已经为null，提前退出
        if (head == null) {
            return head;
        }

        ListNode pre = head;
        ListNode cur = head.next;

        // 已确定当前head.val != val
        while (cur != null) {
            if (cur.val == val) {
                pre.next = cur.next;
            } else {
                pre = cur;
            }
            cur = cur.next;
        }
        return head;
    }


    /**
     * 设置一个虚拟头结点在进行移除节点操作
     * ● 时间复杂度: O(n)
     * ● 空间复杂度: O(1)
     */
    public ListNode removeElements2(ListNode head, int val) {
        while (head == null) {
            return head;
        }
        // 因为删除可能涉及到头节点，所以设置dummy节点，统一操作
        ListNode dummy = new ListNode(-1,head);
        ListNode pre = dummy;
        ListNode cur = head;

        while (cur != null) {
            if (cur.val == val) {
                pre.next = cur.next;
            } else {
                pre = cur;
            }
            cur = cur.next;
        }
        return dummy.next;
    }

}
